package co.gov.medellin.sdep.sisdep.domain;

import co.gov.medellin.sdep.sisdep.common.OracleHelper;

/**
 * <p>
 * Bean encargado de controlar la modal de mensajes de servidor.
 * </p>
 * <p>
 * Copyright (c) 2012<BR>
 * Consult-Soft S.A.<BR>
 * Created on: Jan 05, 2012<BR>
 * 
 * @author atabares
 *         </p>
 */
public class MessageModalWindowController extends BaseController implements java.io.Serializable {

	/** Serial key. */
	private static final long serialVersionUID = 8263489868226178539L;

	/** properties base path location. */
	public static final String MESSAGES = "properties.messages";

	/** Mensaje para ser mostrado por la ventana modal. */
	private String message;

	/**
	 * String usado por las reglas de navegacion para identificar la siguiente
	 * pagina a mostrar. Este outcome es usado por la pagina que esta usando
	 * este componente (modal window).
	 */
	private String outcome;

	/**
	 * Lista de componentes id separados por coma que deberan ser recargados
	 * cuando el boton aceptar es presionado.
	 */
	private String reRender;

	/** Accion onclick predefinida. */
	private static final String ON_CLICK_DEFAULT = "Richfaces.hideModalPanel('messagePanel');";

	/** Acciones Javascript para hacer sobre el evento onclick del boton cerrar. */
	private String onclick;

	/** Imagen actual para mostrar en el message panel. */
	private String image;
	
	/** Accion que indica que debe hacer el boton cancelar en los mensajes de confirmacion. */
	private String cancelAction;
	
	/** Booleano que indica si se debe mostrar el boton cancelar en la modal. */
	private boolean buttonvisible;
	
	/** Imagen predefinida para mostrar un mensaje de alerta. */
	private static final String ALERT_IMAGE = "/images/alert_icon.png";

	/** Imagen predefinida para mostrar un mensaje de error. */
	private static final String ERROR_IMAGE = "/images/error_icon.png";

	/** Imagen predefinida para mostrar un mensaje de exito. */
	private static final String SUCCESS_IMAGE = "/images/success_icon.png";
	
	/** Imagen predefinida para mostrar un mensaje de exito. */
	private static final String CONFIRM_IMAGE = "/images/confirm_icon.png";

	/**
	 * Acciones que pueden ser realizadas cuando se muestran los mensajes a
	 * traves de esta ventana.
	 */
	public static final String ACTION_NAVIGATE = "ACTION_NAVIGATE";

	public static final String ACTION_RERENDER = "ACTION_RERENDER";

	/** Tipos de mensajes a mostrar. */
	public static final String SUCCESS_MESSAGE = "SUCCESS_MESSAGE";

	public static final String ERROR_MESSAGE = "ERROR_MESSAGE";

	public static final String WARNING_MESSAGE = "WARNING_MESSAGE";

	/**
	 * Crea una instancia de esta clase.
	 */
	public MessageModalWindowController() {
		super();
	}

	/**
	 * Obtiene el parametro message.
	 * @see MessageModalWindowController#message
	 *
	 * @return El parametro message.
	 */
	public String getMessage() {
		return message;
	}

	/**
	 * Asigna el parametro message.
	 * @see MessageModalWindowController#message
	 *
	 * @param message valor a asignar al parametro message.
	 */
	public void setMessage(String message) {
		this.message = message;
	}

	/**
	 * Obtiene el parametro outcome.
	 * @see MessageModalWindowController#outcome
	 *
	 * @return El parametro outcome.
	 */
	public String getOutcome() {
		this.clearMessage();
		
		return outcome;
	}

	/**
	 * Asigna el parametro outcome.
	 * @see MessageModalWindowController#outcome
	 *
	 * @param outcome valor a asignar al parametro outcome.
	 */
	public void setOutcome(String outcome) {
		this.outcome = outcome;
	}

	/**
	 * Obtiene el parametro reRender.
	 * @see MessageModalWindowController#reRender
	 *
	 * @return El parametro reRender.
	 */
	public String getReRender() {
		return reRender;
	}

	/**
	 * Asigna el parametro reRender.
	 * @see MessageModalWindowController#reRender
	 *
	 * @param reRender valor a asignar al parametro reRender.
	 */
	public void setReRender(String reRender) {
		this.reRender = reRender;
	}

	/**
	 * Obtiene el parametro onclick.
	 * @see MessageModalWindowController#onclick
	 *
	 * @return El parametro onclick.
	 */
	public String getOnclick() {
		return onclick;
	}

	/**
	 * Asigna el parametro onclick.
	 * @see MessageModalWindowController#onclick
	 *
	 * @param onclick valor a asignar al parametro onclick.
	 */
	public void setOnclick(String onclick) {
		this.onclick = ON_CLICK_DEFAULT + onclick;
	}

	/**
	 * Obtiene el parametro image.
	 * @see MessageModalWindowController#image
	 *
	 * @return El parametro image.
	 */
	public String getImage() {
		return image;
	}

	/**
	 * Asigna el parametro image.
	 * @see MessageModalWindowController#image
	 *
	 * @param image valor a asignar al parametro image.
	 */
	public void setImage(String image) {
		this.image = image;
	}

	/**
	 * Obtiene el parametro cancelAction.
	 * @see MessageModalWindowController#cancelAction
	 *
	 * @return El parametro cancelAction.
	 */
	public String getCancelAction() {
		this.clearMessage();
		
		return cancelAction;
	}

	/**
	 * Asigna el parametro cancelAction.
	 * @see MessageModalWindowController#cancelAction
	 *
	 * @param cancelAction valor a asignar al parametro cancelAction.
	 */
	public void setCancelAction(String cancelAction) {
		this.cancelAction = cancelAction;
	}

	/**
	 * Obtiene el parametro buttonvisible.
	 * @see MessageModalWindowController#buttonvisible
	 *
	 * @return El parametro buttonvisible.
	 */
	public boolean isButtonvisible() {
		return buttonvisible;
	}

	/**
	 * Asigna el parametro buttonvisible.
	 * @see MessageModalWindowController#buttonvisible
	 *
	 * @param buttonvisible valor a asignar al parametro buttonvisible.
	 */
	public void setButtonvisible(boolean buttonvisible) {
		this.buttonvisible = buttonvisible;
	}

	/**
	 * Obtiene el parametro onclickDefault.
	 * @see MessageModalWindowController#onclickDefault
	 *
	 * @return El parametro onclickDefault.
	 */
	public String getOnclickDefault() {
		return ON_CLICK_DEFAULT;
	}

	/**
	 * Obtiene el parametro alertImage.
	 * @see MessageModalWindowController#alertImage
	 *
	 * @return El parametro alertImage.
	 */
	public String getAlertImage() {
		return ALERT_IMAGE;
	}

	/**
	 * Obtiene el parametro errorImage.
	 * @see MessageModalWindowController#errorImage
	 *
	 * @return El parametro errorImage.
	 */
	public String getErrorImage() {
		return ERROR_IMAGE;
	}

	/**
	 * Obtiene el parametro successImage.
	 * @see MessageModalWindowController#successImage
	 *
	 * @return El parametro successImage.
	 */
	public String getSuccessImage() {
		return SUCCESS_IMAGE;
	}

	/**
	 * Obtiene el parametro confirmImage.
	 * @see MessageModalWindowController#confirmImage
	 *
	 * @return El parametro confirmImage.
	 */
	public String getConfirmImage() {
		return CONFIRM_IMAGE;
	}

	/**
	 * Metodo que muestra un mensaje de alerta.
	 * 
	 * @param message Texto para ser mostrado en la ventana.
	 * @param action : Se puede navegar, ya sea a otra pagina o repintar los
	 *            componentes de la ventana que abrio la modal. Esto depende de
	 *            la necesidad, use {@link Action} para obtener el parametro.
	 * @param actionParameters : Si la accion es
	 *            <code>MessageModalWindowController.ACTION_NAVIGATE</code>, este
	 *            parametro deberia contener la regla de navegacion, de otra
	 *            manera este parametro deberia tomar una lista de componentes
	 *            id separados por coma para repintar.
	 */
	public void setAlertMessage(String message, String action, String actionParameters) {
		this.setMessage(message, action, actionParameters, ALERT_IMAGE);
	}

	/**
	 * Metodo que muestra un mensaje de error.
	 * 
	 * @param message Texto para ser mostrado en la ventana.
	 * @param action : Se puede navegar, ya sea a otra pagina o repintar los
	 *            componentes de la ventana que abrio la modal. Esto depende de
	 *            la necesidad, use {@link Action} para obtener el parametro.
	 * @param actionParameters : Si la accion es
	 *            <code>MessageModalWindowController.ACTION_NAVIGATE</code>, este
	 *            parametro deberia contener la regla de navegacion, de otra
	 *            manera este parametro deberia tomar una lista de componentes
	 *            id separados por coma para repintar.
	 */
	public void setErrorMessage(String message, String action, String actionParameters) {
		setMessage(message, action, actionParameters, ERROR_IMAGE);
	}

	/**
	 * Metodo que muestra un mensaje de exito.
	 * 
	 * @param message Texto para ser mostrado en la ventana.
	 * @param action : Se puede navegar, ya sea a otra pagina o repintar los
	 *            componentes de la ventana que abrio la modal. Esto depende de
	 *            la necesidad, use {@link Action} para obtener el parametro.
	 * @param actionParameters : Si la accion es
	 *            <code>MessageModalWindowController.ACTION_NAVIGATE</code>, este
	 *            parametro deberia contener la regla de navegacion, de otra
	 *            manera este parametro deberia tomar una lista de componentes
	 *            id separados por coma para repintar.
	 */
	public void setSuccessMessage(String message, String action, String actionParameters) {
		setMessage(message, action, actionParameters, SUCCESS_IMAGE);
	}
	
	/**
	 * Metodo que muestra un mensaje de confirmacion.
	 * 
	 * @param message Texto para ser mostrado en la ventana.
	 * @param action : Se puede navegar, ya sea a otra pagina o repintar los
	 *            componentes de la ventana que abrio la modal. Esto depende de
	 *            la necesidad, use {@link Action} para obtener el parametro.
	 * @param actionParameters : Si la accion es
	 *            <code>MessageModalWindowController.ACTION_NAVIGATE</code>, este
	 *            parametro deberia contener la regla de navegacion, de otra
	 *            manera este parametro deberia tomar una lista de componentes
	 *            id separados por coma para repintar.
	 */
	public void setConfirmMessage(String message, String action, String actionParameters, String cancelAction) {
		setMessage(message, action, actionParameters, CONFIRM_IMAGE);
		
		this.setCancelAction(cancelAction);
		this.setButtonvisible(true);
	}

	/**
	 * Este metodo setea el mensaje, imagen, parametros del estilo para mostrar
	 * en la ventana de mensajes.
	 * 
	 * @param mensaje : texto para ser mostrado.
	 * @param action : Se puede navegar, ya sea a otra pagina o repintar los componentes de la ventana que 
	 * 				abrio la modal. Esto depende de la necesidad, use {@link Action} para obtener el parametro.
	 * @param actionParameters : Si la accion es <code>MessageModalWindowController.ACTION_NAVIGATE</code>, este
	 *            parametro deberia contener la regla de navegacion, de otra manera este parametro deberia 
	 *            tomar una lista de componentes id separados por coma para repintar.
	 * @param image : Imagen asociada al tipo de mensaje.
	 */
	private void setMessage(String message, String action, String actionParameters, String image) {

		if (action != null) {
			if (actionParameters == null || actionParameters.length() == 0) {
				throw new IllegalArgumentException(
						"El parametro actionParameters no debe ser null y su longitud debe ser > 0");
			}
			
			action(action, actionParameters);
		} else {
			String reRenderStr = actionParameters != null ? actionParameters + "," : "";
			this.reRender = reRenderStr + "clearReRender";
			this.outcome = null;
		}
		
		this.message = message;
		this.image = image;
		this.onclick = ON_CLICK_DEFAULT;
		this.setButtonvisible(false);
	}

	/**
	 * Setea los parametros dependiendo de la accion.
	 * 
	 * @param action : Se puede navegar, ya sea a otra pagina o repintar los
	 *            componentes de la ventana que abrio la modal. Esto depende de
	 *            la necesidad, use {@link Action} para obtener el parametro.
	 * @param actionParameters  : Si la accion es
	 *            <code>MessageModalWindowController.ACTION_NAVIGATE</code>, este
	 *            parametro deberia contener la regla de navegacion, de otra
	 *            manera este parametro deberia tomar una lista de componentes
	 *            id separados por coma para repintar.
	 */
	private void action(String action, String actionParameters) {
		if (action.equals(MessageModalWindowController.ACTION_NAVIGATE)) {
			this.outcome = actionParameters;
			this.reRender = null;
		} else if (action.equals(MessageModalWindowController.ACTION_RERENDER)) {
			this.outcome = null;
			this.reRender = actionParameters + ",clearReRender";
		}
	}

	/**
	 * Limpia el mensaje, imagen y el styleClass.
	 */
	public void clearMessage() {
		this.message = "";
		this.image = "";
	}

	/**
	 * Retorna el mensaje que se va a mostrar.
	 * 
	 * @return mensaje a mostrar en pantalla.
	 */
	public boolean getShowWhenRendered() {
		return !OracleHelper.isNullorEmpty(message);
	}

	/**
	 * Metodo que retorna el numero de documento del usuario del portal autenticado
	 * en el sistema.
	 * @return
	 */
	public String getLoggedUser() {
		return getLoggedUserID();
	}
	
}